﻿/*==============================================
JEU DE LA VIE
sequentiel.h
Author : S꣡stien Dez & Arnaud Villejobert
==============================================*/

#define D_SIZE 10 //Taille d'un domaine size*size
#define M_SIZE 10 //Taille d'un morceau size*size
#define NB_MORCEAUX (D_SIZE*D_SIZE) //nombre de morceaux dans un domaine
#define P_VIVANT_INIT 42 //Pourcentage de cellules vivantes à l'init



#ifndef JDLV_SEQUENTIEL_H
#define JDLV_SEQUENTIEL_H

/*==============================================
STRUCTURES
==============================================*/

typedef struct{
 int listeCellules[M_SIZE][M_SIZE];
} Morceau;

typedef struct{
 Morceau listeMorceaux[D_SIZE][D_SIZE];
} Domaine;

typedef struct{
    int x ; //
    int y ;
    Domaine *dEntree;
    Domaine *dSortie;
}argThread2;


/*==============================================
METHODES
==============================================*/

#endif
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus

//Rempli un morceau de cellules avec valeurs alꢴoires (0 morte, 1 vivante)
Morceau initialiserMorceau();

//Affiche les cellules d'un morceau dans la console (0 morte, 1 vivante)
void afficherMorceau(Morceau morceauTmp);

//Rempli un domaine de morceaux
Domaine initialiserDomaine();

//Affiche la ligne prꤩse k d'un morceau m
void afficherLigneMorceau(Morceau morceauTmp, int ligneK);

//Affiche les morceaux d'un domaine dans la console
void afficherMorceaux(Domaine domaineTmp);

//Retourne un int qui correspond au nombre de cellules vivantes autour de la cellule courante
int calculerNombreCellulesVivantesVoisines(int celluleA, int celluleB, int celluleC, 
											int celluleD, int celluleF, int celluleG, int celluleH, int celluleI);

//Renvoie true si la cellule est vivante (1) false sinon
bool estVivante(int cellule);

//D굥rmine si une cellule meurt ou vie
//Fonction des cellules aux alentours
// A B C
// D E F
// G H I
//E EST LA CELLULE COURANTE A TRAITER
int evolutionCellule(int celluleA, int celluleB, int celluleC, 
					 int celluleD, int celluleE, int celluleF,
					 int celluleG, int celluleH, int celluleI);

//Retourne la valeur d'une cellule pr괥nte ࡘ Y dans le morceau contenant
int obtenirValeurCellule(Morceau contenant, int x, int y);

//Parcours les cellules d'un morceau donn顰our les faire evoluer
//X,Y 굡nt les coordonn꦳ du morceau courant
Morceau parcourirCellules(Domaine *domaine, int x, int y);

//Fait 귯luer les cellules
Domaine jeuDeLaVie(Domaine dEntree);

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
